package classificator.tree;

import classificator.data.Data;
import classificator.data.DiscreteAttribute;

/**Estende la classe Node e modellare l'entità nodo fogliare. 
 *
 * @author 467644
 */
public class LeafNode extends Node{
    //Valore dell'attributo di classe espresso nella foglia corrente 
    private String predictedClassValue; 

    /**Costruttore. Istanzia un oggetto invocando il costruttore della superclasse e 
     * avvalora l'attributo predictedClassValue. 
     * 
     * @param trainingSet training set complessivo
     * @param beginExampleIndex indice iniziale del sotto-insieme di training coperto nella foglia 
     * @param endExampleIndex indice finale del sotto-insieme di training coperto nella foglia 
     */
    LeafNode(Data trainingSet, int beginExampleIndex, int endExampleIndex) {
        super(trainingSet, beginExampleIndex, endExampleIndex);
        //System.out.println("determineMostFrequentClass " + beginExampleIndex + "-" + endExampleIndex);
        predictedClassValue = determineMostFrequentClass(trainingSet, beginExampleIndex, endExampleIndex);
    }
    
    /**determina l'attributo di classe più frequente nel sotto-insieme di training 
     * 
     * @param trainingSet training set complessivo
     * @param beginExampleIndex indice iniziale del sotto-insieme di training coperto nella foglia 
     * @param endExampleIndex indice finale del sotto-insieme di training coperto nella foglia 
     * @return valore della classe rappresentato dalla foglia
     */
    private String determineMostFrequentClass(Data trainingSet, int beginExampleIndex, int endExampleIndex){
        DiscreteAttribute classAttr = trainingSet.getClassAttribute();
        String maxValue = null;
        int currMax = 0;
        String currString;
        int currFrequency;

        for (int i = 0; i < classAttr.getNumberOfDistinctValues(); i++)		{
            currString = classAttr.getValue(i);
            currFrequency = classValueAbsoluteFrequecy.get(currString);
            if (currMax < currFrequency){
                    currMax = currFrequency;
                    maxValue = currString;
            }
        }
        return maxValue;
    } 
    
    /**restituisce il numero di split originanti dal nodo foglia, ovvero 0. 
     * 
     * @return numero di split
     */
    @Override
    public int getNumberOfChildren() {
        return 0;
    } 

    /**restituisce il valore dell'attributo predictedClassValue 
     * 
     * @return predictedClassValue
     */
    public String getPredictedClassValue() {
        return predictedClassValue;
    }
    
    /**invoca il metodo della superclasse, assegnando anche il valore di classe della foglia. 
     * 
     * @return 
     */
    @Override
    public String toString() {
        return super.toString() + " value class foglia " + predictedClassValue;
        //return ("[Leaf] Class Value = " + predictedClassValue + " " + super.toString());
    }
}
